home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 001 / wimpext / SWIs < prev    next >
Text File  |  1993-05-11  |  61KB  |  1,669 lines

  1. WimpExtension SWIs - 2.17
  2. ==================
  3.  
  4. Note: All strings are control-terminated (ie. <32)
  5.       All SWIs preserve all registers that are not used to return information
  6.       except for R0, which is always corrupted (or used to return
  7.       information). The processor status flags are always preserved unless
  8.       there is an error.
  9.       I have tried to make the icon-handling SWIs 'intelligent' - ie. if you
  10.       tell WimpExtension to set an icon (for example) it won't do anything if
  11.       it's already set, so it won't flicker.
  12.  
  13.       WimpExtension has two SWI chunks - &45780 and &46380.
  14.  
  15.       SWI &457BF is unused; this is due to a really really stupid bug in
  16.       RISC OS.
  17.  
  18. Brief list:
  19. -------------------------------
  20. WimpExt_Initialise       &45780
  21. WimpExt_CloseDown        &45781
  22. WimpExt_SlabIcon         &45782
  23. WimpExt_Redraw           &45783
  24. WimpExt_Action           &45784
  25. WimpExt_IconBarSprite    &45785
  26. WimpExt_IconBarText      &45786
  27. WimpExt_LinkWindows      &45787
  28. WimpExt_OpenLinked       &45788
  29. WimpExt_CloseLinked      &45789
  30. WimpExt_UnLinkWindows    &4578A
  31. WimpExt_CurrentTask      &4578B
  32. WimpExt_LoadTemplates    &4578C
  33. WimpExt_SetIconString    &4578D
  34. WimpExt_OpenWindowTop    &4578E
  35. WimpExt_SetIcon          &4578F
  36. WimpExt_GetIcon          &45790
  37. WimpExt_SetNumberIcon    &45791
  38. WimpExt_GetNumberIcon    &45792
  39. WimpExt_IncNumberIcon    &45793
  40. WimpExt_DecNumberIcon    &45794
  41. WimpExt_SetPointer       &45795
  42. WimpExt_Divide           &45796
  43. WimpExt_ColoursMenu      &45797
  44. WimpExt_AutoRedraw       &45798
  45. WimpExt_CentreWindow     &45799
  46. WimpExt_DragIcon         &4579A
  47. WimpExt_PutCaretIcon     &4579B
  48. WimpExt_OpenDialogue     &4579C
  49. WimpExt_CheckWindowOpen  &4579D
  50. WimpExt_CopyString       &4579E
  51. WimpExt_SetWindowTitle   &4579F
  52. WimpExt_SetIconStringN   &457A0
  53. WimpExt_FindLeaf         &457A1
  54. WimpExt_LimitPointer     &457A2
  55. WimpExt_ReleasePointer   &457A3
  56. WimpExt_OpenFullSize     &457A4
  57. WimpExt_LoadRAMTemplate  &457A5
  58. WimpExt_OpenRequester    &457A6
  59. WimpExt_CloseRequester   &457A7
  60. WimpExt_HideLink         &457A8
  61. WimpExt_UnHideLink       &457A9
  62. WimpExt_SendHelp         &457AA
  63. WimpExt_SendWimpHelp     &457AB
  64. WimpExt_CreateMenu       &457AC
  65. WimpExt_ReCreateMenu     &457AD
  66. WimpExt_ShadeEntry       &457AE
  67. WimpExt_TickEntry        &457AF
  68. WimpExt_SetIconColour    &457B0
  69. WimpExt_ShadeIcon        &457B1
  70. WimpExt_PlotSprite       &457B2
  71. WimpExt_RedrawDraw       &457B3
  72. WimpExt_PrePoll          &457B4
  73. WimpExt_SetExtent        &457B5
  74. WimpExt_MoveCaret        &457B6
  75. WimpExt_GetFontMenu      &457B7
  76. WimpExt_DecodeFontMenu   &457B8
  77. WimpExt_ControlImmediate &457B9
  78. WimpExt_Heap             &457BA
  79. WimpExt_MemCopy          &457BB
  80. WimpExt_DataSave         &457BC
  81. WimpExt_PlotBorder       &457BD
  82. WimpExt_CentreWindowV    &457BE
  83. WimpExt_Sort             &46380
  84. WimpExt_MemMove          &46381
  85. WimpExt_MenuWidth        &46382
  86. WimpExt_DataLoad         &46383
  87. WimpExt_MoveCaretIcon    &46384
  88. WimpExt_DrawOp           &46385
  89. WimpExt_SpriteOp         &46386
  90. WimpExt_Intersect        &46387
  91. WimpExt_BorderOp         &46388
  92. WimpExt_ManualLink       &46389
  93. WimpExt_MiscOp           &4638A
  94. WimpExt_ViewIcon         &4638B
  95. WimpExt_SubsituteArgs    &4638C
  96. WimpExt_RedirectSprites  &4638D
  97. -------------------------------
  98.  
  99.  
  100. WimpExt_Initialise       &45780
  101. -------------------------------
  102. R0 = 16
  103. R1 = task handle
  104. R2 = features flags
  105.        bit     meaning
  106.        0       Semi-automatic slabbing if set, automatic otherwise
  107.        1       Automatically recreate menus if set
  108.        2       Task wants to use font menus if set
  109.        3       Automatically compact heap once a second if set
  110.        4       'Correct' radio icons if set
  111.        5       Semi-automatic help if set, automatic otherwise
  112.        6       Use alternative parameters for flag-setting SWIs if set
  113.        7       Use R0 of WimpExt_SetIconString[N]
  114.        8       Automatically call WimpExt_MoveCaret
  115.        9       Unset other icons in ESG when setting icons
  116.        10      Automatically call WimpExt_ViewIcon after moving caret
  117.        11      Don't allow TAB for moving between writeable icons
  118.        12-31   reserved; MUST BE 0
  119. Exit:
  120. R0 = WimpExt version number * 100
  121. R2 = pointer to WimpExt's sprite pool
  122.  
  123. Must be called prior to using any other WimpExt calls. R0 must be 11 on
  124. entry. This is so that WimpExtension can work out what version the program
  125. thinks it is calling (so I can change the functionality of calls later whilst
  126. still retaining backwards-compatibility). R2 holds features flags, for
  127. specifying certain things at start-up. If bit 1 of R2 is set then if the user
  128. selects a menu option with the ADJUST button then the menu will automatically
  129. be recreated when you next call WimpExt_PrePoll (assuming you used
  130. 'WimpExt_CreateMenu' to create the menu, that is). If bit 2 of R2 is set then
  131. you are allowed to call WimpExt_GetFontMenu and WimpExt_DecodeFontMenu - you
  132. are NOT allowed to call them if you do not set bit 2. If bit 4 of R2 is set
  133. then the user won't be able to deselect all of a group of radio icons by
  134. clicking adjust on the selected icon.
  135.  
  136.  
  137. WimpExt_CloseDown        &45781
  138. -------------------------------
  139. R0 = task handle
  140.  
  141. MUST be called prior to the task exiting.
  142.  
  143.  
  144. WimpExt_SlabIcon         &45782
  145. -------------------------------
  146. R2 = window handle or 0 for slabbed icon
  147. R3 = icon handle
  148. If semi-automatic slabbing is enabled, then:
  149. R4 = 0 to pop out, any other to pop in
  150.  
  151. To be called to force an icon to be slabbed (for example to slab the default
  152. action icon if RETURN is pressed). If semi-automatic slabbing is enabled then
  153. the icon will be popped in or out depending on R4, otherwise it will be
  154. popped in and then out again. If R2 is zero then the last icon to be slabbed
  155. in (either implicity or explicity) is used. Note that in this case the SWI
  156. might return an error (eg. if the window has been deleted), so use the X form
  157. of the SWI.
  158.  
  159.  
  160. WimpExt_Redraw           &45783
  161. -------------------------------
  162. R1 = Wimp_RedrawWindow block
  163.  
  164. To be called in the window redraw loop, to draw the 3D borders round icons.
  165.  
  166.  
  167. WimpExt_Action           &45784
  168. -------------------------------
  169. R0 = task handle
  170. R1 = Wimp_Poll block
  171. R2 = Wimp_Poll reason code
  172. Exit:
  173. R0 = Wimp_Poll reason code (possibly altered)
  174.  
  175. To be called immediately after Wimp_Poll, to perform actions such as slabbing
  176. icons and changing pointers. WimpExtension may alter the code returned - eg.
  177. if the user clicks in a requester window then the code will be translated
  178. before your program gets to see it.
  179.  
  180.  
  181. WimpExt_IconBarSprite    &45785
  182. -------------------------------
  183. R2 = -2 for left of iconbar, -1 for right
  184. R3 = pointer to sprite name
  185. R5 = icon button type (eg. 3)
  186. Exit:
  187. R0 = icon handle
  188.  
  189. Will place a sprite on the iconbar, returning the icon handle. Note that the
  190. sprite name is copied out of the memory block, which can be reused. Also note
  191. that the number in R5 is just the button type, not the flags.
  192.  
  193.  
  194. WimpExt_IconBarText      &45786
  195. -------------------------------
  196. R2 = -2 for left of iconbar, -1 for right
  197. R3 = pointer to sprite name
  198. R4 = pointer to text (max. 128 chars inc. terminator)
  199. R5 = icon button type (eg. 3)
  200. Exit:
  201. R0 = icon handle
  202.  
  203. Will place a sprite on the iconbar, with a text message underneath, returning
  204. the icon handle. Note that the sprite name is copied out of the memory block,
  205. which can be reused, but the text remains where it is; this is so you can
  206. change the text after creating the icon. Also note that the number in R5 is
  207. just the button type, not the flags.
  208.  
  209.  
  210. WimpExt_LinkWindows      &45787
  211. -------------------------------
  212. R2 = main window handle
  213. R3 = sub-window handle
  214. R4 = flags
  215.      bit    meaning
  216.      0      clip linked window to the left of the main window
  217.      1      clip linked window to the right of the main window
  218.      2      clip linked window above the main window
  219.      3      clip linked window below the main window
  220.      4-30   reserved; MUST BE 0
  221.      31     link is hidden
  222.  
  223. Will link two windows so the sub-window moves with the main window. Currently
  224. there is a limit of 16 linked windows - this may be removed in a later
  225. version.
  226.  
  227.  
  228. WimpExt_OpenLinked       &45788
  229. -------------------------------
  230. R1 = Wimp_OpenWindow block
  231.  
  232. To be used instead of Wimp_OpenWindow. It does the same thing, but if the
  233. window is linked then it will handle the link. If the window is not linked,
  234. it has the same effect as Wimp_OpenWindow.
  235.  
  236.  
  237. WimpExt_CloseLinked      &45789
  238. -------------------------------
  239. R1 = Wimp_CloseWindow block
  240.  
  241. To be used instead of Wimp_CloseWindow. It does the same thing, but if the
  242. window is linked then it will close the linked window as well. If the window
  243. is not linked, it has the same effect as Wimp_CloseWindow.
  244.  
  245.  
  246. WimpExt_UnLinkWindows    &4578A
  247. -------------------------------
  248. R2 = main window handle
  249. R3 = sub-window handle
  250.  
  251. Will remove the link between the specified window and its subwindow. Note
  252. that this just removes the pointer in WimpExtension workspace, if the windows
  253. are on the screen they will remain there. You do not have to call
  254. UnLinkWindows before you exit - it is here so that you can unlink windows
  255. while your application is still running.
  256.  
  257.  
  258. WimpExt_CurrentTask      &4578B
  259. -------------------------------
  260. R0 = task handle
  261. Exit:
  262. R0 = previous task handle
  263.  
  264. Informs WimpExtension which task is currently active. Not needed if you have
  265. called WimpExt_Initialise or WimpExt_Action since the last Wimp_Poll. The
  266. previous user is returned in R0.
  267.  
  268.  
  269. WimpExt_LoadTemplates    &4578C
  270. -------------------------------
  271. R0 = pointer to buffer for storing window handles
  272. R1 = pointer to user buffer for template (big enough for largest template)
  273. R2 = pointer to workspace for indirected icons
  274. R3 = pointer to end of workspace for indirected icons
  275. R4 = 256-byte font reference array (-1 for no fonts)
  276. R5 = pointer to filename of templates file
  277. R6 = pointer to sprite area control block (+1 for Wimp sprite pool)
  278.  
  279. Loads in all the templates from the file whose name is pointed to by R5, and
  280. called Wimp_CreateWindow for each one. The value in R6 is placed in the
  281. window block at offset +64. Stores the window handles sequentially in the
  282. buffer pointed to by R0, in the order they are found in the templates file.
  283. On exit the buffer pointed to by R1 will contain the template for the last
  284. window in the file. The buffer for window handles should be big enough to
  285. store all the window handles, each of which is a word. For each window, if
  286. the word on entry is zero the window will be created as usual. Bits that are
  287. set have the following meanings:
  288.  
  289.     Bit   Meaning if set
  290.     ----------------------------------------------
  291.     0     centre window horizontally
  292.     1     don't create window
  293.     2     centre window vertically
  294.  
  295. Bit 1 is useful if you have the last window in the file as one that you want
  296. repeatedly, but you don't want it created at once.
  297.  
  298.  
  299. WimpExt_SetIconString    &4578D
  300. -------------------------------
  301. R0 = non-zero for ellipsis (only if enabled in WimpExt_Initialise)
  302. R2 = window handle
  303. R3 = icon handle
  304. R4 = pointer to string
  305.  
  306. Copies the string pointed to by R2 into the specified indirected text icon,
  307. and updates the screen if necessary. If the caret was in the icon then it is
  308. moved to the end of the new string. Only updates the screen if anything was
  309. changed - ie. if the new string is the same as the old string then nothing
  310. will happen. If R0 is non-zero and bit 7 was set in R2 in WimpExt_Initialise
  311. and the string is longer than the icon can hold then the string will be
  312. post-fixed with '...'.
  313.  
  314.  
  315. WimpExt_OpenWindowTop    &4578E
  316. -------------------------------
  317. R0 = window handle
  318.  
  319. Opens the window whose handle is in R0, or brings it to the top if it is
  320. already open. If the 'Back' attribute is set then it opens it at the back
  321. instead. Calls WimpExt_OpenLinked, so linked windows are handled correctly.
  322.  
  323.  
  324. WimpExt_SetIcon          &4578F
  325. -------------------------------
  326. R2 = window handle
  327. R3 = icon handle
  328. R4 = 0 to deselect icon, non-zero to select icon
  329. If bit 6 of R2 was set in WimpExt_Initialise:
  330. R4 = 0 to deselect icon, 1 to select icon, 2 to toggle icon
  331. Exit:
  332. R0 = old state of icon (0 for unset, 1 for set)
  333.  
  334. Selects the icon if R4 is non-zero, deselects it otherwise. Updates the
  335. screen if necessary. If bit 6 of R2 was set in WimpExt_Initialise then the
  336. alternative parameters are used as shown. If bit 9 of R2 was set in
  337. WimpExt_Initialise and you are setting the icon, then other icons in the same
  338. ESG will be unset.
  339.  
  340.  
  341. WimpExt_GetIcon          &45790
  342. -------------------------------
  343. R2 = window handle
  344. R3 = icon handle
  345. Exit:
  346. R0 = 0 if icon is not selected, 1 if it is selected
  347. R3 = Word at iconblock+20 (ie. pointer to indirected text for indirected text
  348.      icon)
  349.  
  350. Detects whether the icon is selected, and returns 1 in R0 if it is, 0
  351. otherwise. Also returns in R3 the value in the iconblock at offset 20. For an
  352. indirected text icon this will be a pointer to the text.
  353.  
  354.  
  355. WimpExt_SetNumberIcon    &45791
  356. -------------------------------
  357. R0 = base
  358. R2 = window handle
  359. R3 = icon handle
  360. R4 = value
  361.  
  362. Converts the signed integer in R4 into a string and places it in the icon.
  363. Updates the screen as necessary. The base to be used is specified in R0 - it
  364. must be in the range 2-36.
  365.  
  366.  
  367. WimpExt_GetNumberIcon    &45792
  368. -------------------------------
  369. R0 = default base
  370. R2 = window handle
  371. R3 = icon handle
  372. Exit:
  373. R0 = value
  374.  
  375. Converts the string in the icon to a signed integer and places it in R0. The
  376. base to be used by default is specified in R0 - it must be in the range 2-36.
  377.  
  378.  
  379. WimpExt_IncNumberIcon    &45793
  380. -------------------------------
  381. R0 = base
  382. R2 = window handle
  383. R3 = icon handle
  384. R4 = maximum value
  385. R5 = step
  386. Exit:
  387. R0 = new value
  388.  
  389. Converts the string in the icon to an signed integer, adds the step, and puts
  390. it back. Updates the screen as necessary. The value will not go beyond the
  391. value passed in R4, and the new value is returned in R0.
  392.  
  393.  
  394. WimpExt_DecNumberIcon    &45794
  395. -------------------------------
  396. R0 = base
  397. R2 = window handle
  398. R3 = icon handle
  399. R4 = minimum value
  400. R5 = step
  401. Exit:
  402. R0 = new value
  403.  
  404. Converts the string in the icon to an signed integer, subtracts the step, and
  405. puts it back. Updates the screen as necessary. The value will not go beyond
  406. the value passed in R4, and the new value is returned in R0.
  407.  
  408.  
  409. WimpExt_SetPointer       &45795
  410. -------------------------------
  411. R0 = pointer to sprite name in the Wimp sprite pool, or 0 to reset pointer
  412. If R0>=&8000:
  413. R2 = hotspot X
  414. R3 = hotspot Y
  415.  
  416. Stores the old pointer palette, and changes the pointer palette and shape to
  417. the sprite specified in R0 (palette optional). The 'hotspot' is defined by
  418. the X and Y coordinates (pixels) in R2 and R3. If R0 is <&8000 then it will
  419. reset the pointer to its original state. You don't need to check if the
  420. pointer is already reset or changed as WimpExtension will do this for you.
  421. Note that the pointer will keep changed until you specifically ask for it to
  422. be reset - ie. pointer changes over icons will be suspended, and the pointer
  423. will remain changed outside your window's workarea.
  424.  
  425.  
  426. WimpExt_Divide           &45796
  427. -------------------------------
  428. R2 = numerator
  429. R3 = denominator
  430. Exit:
  431. R0 = result
  432. R2 = remainder
  433.  
  434. Returns (R2 DIV R3) in R0 and (R2 MOD R3) in R2. Useful for calculating which
  435. area of window needs to be updated. An error is produced if R3 is zero on
  436. entry.
  437.  
  438.  
  439. WimpExt_ColoursMenu      &45797
  440. -------------------------------
  441. R0 = colour to be ticked
  442. R2 = 0 to have just colours, 1 to have extra option
  443. Exit:
  444. R0 = pointer to colour menu
  445.  
  446. Creates a colour menu (like Edit's 'Background' and 'Foreground' ones),
  447. making the text of each option black or white depending on the brightness of
  448. that colour in the current palette. If the value in R0 on entry is in the
  449. range 0-15 then that colour will be ticked in the menu. The call returns a
  450. pointer to the menu block (in RMA workspace). If the value in R2 on entry is
  451. 1 then a 17th option will be added, 'Transparent'. You can change the text of
  452. this by changing the menu block if you want (it's in RMA). The 17th option
  453. will be ticked if R0 on entry is 16.
  454.  
  455.  
  456. WimpExt_AutoRedraw       &45798
  457. -------------------------------
  458. R1 = Wimp_Poll reason code 1 block
  459.  
  460. This call can be used instead of the normal Wimp_RedrawWindow/GetRectangle
  461. loop if the window doesn't contain any graphics drawn by your program. It
  462. does the equivalent of:
  463.  
  464.         SYS "Wimp_RedrawWindow",,q% TO flag%
  465.         WHILE flag%
  466.                 SYS "WimpExt_Redraw",,q%
  467.                 SYS "Wimp_GetRectangle",,q% TO flag%
  468.         ENDWHILE
  469.  
  470.  
  471. WimpExt_CentreWindow     &45799
  472. -------------------------------
  473. R1 = pointer to block:
  474.       R1 +  0   visible area minimum x coordinate
  475.       R1 +  4   visible area minimum y coordinate
  476.       R1 +  8   visible area maximum x coordinate
  477.       R1 + 12   visible area maximum y coordinate
  478.       R1 + 28   window flags
  479. Exit:
  480.       Block contains altered coordinates
  481.  
  482. This call shifts the x coordinates in the supplied block so that the window
  483. described would be centred horizontally on the screen. You can use this call
  484. before Wimp_CreateWindow - eg:
  485.        SYS "WimpExt_CentreWindow",,q%
  486.        SYS "WimpExt_CreateWindow",,q% TO handle%
  487. or you can use it before Wimp_OpenWindow - eg:
  488.        SYS "WimpExt_CentreWindow",,q%+4
  489.        SYS "WimpExt_OpenWindow",,q%
  490. If you are using WimpExt_LoadTemplates then windows can be centred
  491. automatically for you (see description above).
  492.  
  493.  
  494. WimpExt_DragIcon         &4579A
  495. -------------------------------
  496. R0 = flags:
  497.       0-1 Horizontal position:
  498.             00 = left
  499.             01 = middle
  500.             10 = right
  501.             11 = undefined
  502.       2-3 Vertical position:
  503.             00 = bottom
  504.             01 = middle
  505.             10 = top
  506.             11 = undefined
  507.       4-5 Mouse bounding box:
  508.             00 = whole screen
  509.             01 = constrain to parent window
  510.             10 = constrain to box pointed to by R5
  511.             11 = undefined
  512.       6   constrain sprite if set, otherwise constrain pointer
  513.       7   shadow if set
  514.       8   use DragASprite even if CMOS flag isn't set
  515.      9-31 reserved; MUST BE 0
  516. R1 = pointer to sprite block, +1 for Wimp sprite area, 0 to use dash box
  517. R2 = window handle
  518. R3 = icon handle
  519. R4 = pointer to sprite name (if R1<>0)
  520. R5 = pointer to mouse bounding box (only if necessary - see flags)
  521.       +00 xmin
  522.       +04 ymin
  523.       +08 xmax
  524.       +12 ymax
  525.  
  526. This SWI does one of two things. If the DragASprite module is loaded, and
  527. bit 1 of byte 28 of the CMOS RAM is set, and R1<>0 then it will use the
  528. DragASprite module as follows:
  529.   Work out the parameters to 'DragASprite_Start' and call it. If this
  530.   produces an error then try again with dash box as described below.
  531. Otherwise it makes an ordinary rotating dash box as follows:
  532.   Work out the parameters to 'Wimp_DragBox' and call it. Bits 0-3 and 7 of
  533.   the flags are ignored.
  534. If you are using this SWI at any time with R1<>0 then remember to call
  535. XDragASprite_Stop at appropriate points. You MUST use the X form of the SWI,
  536. and you must ignore errors.
  537.  
  538.  
  539. WimpExt_PutCaretIcon     &4579B
  540. -------------------------------
  541. R2 = window handle
  542. R3 = icon handle
  543.  
  544. Works out the length of the text icon specified and calls
  545. Wimp_SetCaretPosition to position the caret at the end of the string.
  546.  
  547.  
  548. WimpExt_OpenDialogue     &4579C
  549. -------------------------------
  550. R2 = window handle
  551. R3 = X Offset
  552. R4 = Y Offset
  553.  
  554. Opens the specified window using Wimp_CreateMenu at the pointer position,
  555. offset by R3 and R4. The coordinates used are PointerX-R3,PointerY+R4.
  556.  
  557.  
  558. WimpExt_CheckWindowOpen  &4579D
  559. -------------------------------
  560. R0 = window handle (or -3 for requester window)
  561. Exit:
  562. R0 = 0 if window closed, 1 if open
  563.  
  564. Checks to see if the specified window is open.
  565.  
  566.  
  567. WimpExt_CopyString       &4579E
  568. -------------------------------
  569. R2 = 'from' pointer
  570. R3 = 'to' pointer
  571.  
  572. Copies the control-terminated string from R2 to R3. The string stored at R3
  573. will be zero-terminated whatever the terminator was for the original string.
  574.  
  575.  
  576. WimpExt_SetWindowTitle   &4579F
  577. -------------------------------
  578. R2 = window handle
  579. R3 = pointer to string
  580.  
  581. Copies the string in R3 into the window whose handle is in R2. The title must
  582. be indirected. Updates the screen if necessary.
  583.  
  584.  
  585. WimpExt_SetIconStringN   &457A0
  586. -------------------------------
  587. R0 = non-zero for ellipsis (only if enabled in WimpExt_Initialise)
  588. R2 = window handle
  589. R3 = icon handle
  590. R4 = pointer to string
  591.  
  592. Copies the string pointed to by R2 into the specified indirected text icon,
  593. and updates the screen if necessary. If the string is longer than the size of
  594. the buffer then the right-hand end of the string is copied (as opposed to the
  595. left-hand end, which is the case if you use WimpExt_SetIconString). If the
  596. caret was in the icon then it is moved to the end of the new string. If R0 is
  597. non-zero and bit 7 was set in R2 in WimpExt_Initialise and the string is
  598. longer than the icon can hold then the string will be pre-fixed with '...'.
  599.  
  600.  
  601. WimpExt_FindLeaf         &457A1
  602. -------------------------------
  603. R0 = pointer to pathname
  604. Exit:
  605. R0 = pointer to leafname
  606.  
  607. Finds the last occurence of '.' in the string pointed to by R0, and returns a
  608. pointer to the next character. eg. given 'scsi::HardDisc.$.first.second.last'
  609. it will return a pointer to 'last'. This can be useful for both extracting
  610. the leaf name, and for determining what directory the file is in (by poking
  611. a zero to (R0-1) - eg. MOV R2,#0  STRB R2,[R0,#-1] ).
  612.  
  613.  
  614. WimpExt_LimitPointer     &457A2
  615. -------------------------------
  616. R0 = window handle
  617.  
  618. Limits the mouse pointer to the visible area of the window specified. Note
  619. that if there are draggable objects within this area and these are used then
  620. the mouse rectangle is reset. It is also reset if there is a change of mode,
  621. eg. if the user presses F12 and then Return.
  622.  
  623.  
  624. WimpExt_ReleasePointer   &457A3
  625. -------------------------------
  626.  
  627. Releases the limits on the mouse pointer - ie. sets the mouse rectangle to be
  628. the entire screen. Note that this call resets the graphics origin and the
  629. graphics and text windows (ie. it does a 'VDU 26').
  630.  
  631.  
  632. WimpExt_OpenFullSize     &457A4
  633. -------------------------------
  634. R2 = window handle
  635. R3 = window to open behind (-1 = top, -2 = bottom)
  636.  
  637. Opens the window to maximum size - ie. the same as clicking on the toggle
  638. icon.
  639.  
  640.  
  641. WimpExt_LoadRAMTemplate  &457A5
  642. -------------------------------
  643. R1 = pointer to user buffer for window definition
  644. R2 = pointer to workspace for indirected icons
  645. R3 = pointer to end of workspace for indirected icons
  646. R4 = -1 for no fonts - fonts not supported at present
  647. R5 = pointer to template
  648. Exit:
  649. R2 = pointer to end of workspace used (ie. first free byte)
  650.  
  651. This call is similar to Wimp_LoadTemplate except that it uses templates in
  652. RAM. This is designed to be used in Module tasks, where you cannot have a
  653. separate Templates file. You would use the supplied 'FNtemplate' function to
  654. insert the template in your module, and then call WimpExt_LoadRAMTemplate to
  655. convert this to a window definition. At present fonts in templates are not
  656. supported - this may be fixed in a later version.
  657.  
  658.  
  659. WimpExt_OpenRequester    &457A6
  660. -------------------------------
  661. R2 = title (eg. 'Message from MyTask')
  662. R3 = text (eg. 'Document not saved. Save?')
  663. R4 = pointer to block containing button definitons
  664.        Text for default button    (eg. 'Save')
  665.        Text for button 1          (eg. 'Discard')
  666.        Text for button 2          (eg. 'Cancel')
  667.        ...
  668. R5 = button to be used if 'Escape' is pressed (0-3)
  669.  
  670. Opens a requester box with a title, a message and some buttons along the
  671. right-hand edge. The pointer is constrained to the requester window. The
  672. buttons may contain any text up to 8 characters. You can have up to 4
  673. buttons. They are filled with the text specified from the bottom one (the
  674. default) upwards. If the text for a button is a null string then that button
  675. will not be created. If the user presses Return then the default button is
  676. pressed. If the user presses Escape then the button specified in R5 is
  677. pressed. Mouse_Click events to the requester window will be passed from
  678. WimpExt_Action filtered so that only Select and Adjust are passed through,
  679. the window handle is -3, and the icon handle will be 0-3. You can check
  680. whether the requester window is open by using WimpExt_CheckWindowOpen.
  681.  
  682.  
  683. WimpExt_CloseRequester   &457A7
  684. -------------------------------
  685.  
  686. Closes the requester window and releases the mouse pointer. This is done
  687. automatically if the user selects a button in the requester box, or presses
  688. Escape or Return. If the window wasn't open then no error is generated.
  689.  
  690.  
  691. WimpExt_HideLink         &457A8
  692. -------------------------------
  693. R0 = main window handle
  694. R2 = sub-window handle
  695.  
  696. Temporarily hides the link between the specified window and its sub-window.
  697. This is useful, for example, for removing toolboxes in such a way that they
  698. can be replaced later. Note that this call does no screen update - ie. the
  699. sub-window remains where it is.
  700.  
  701.  
  702. WimpExt_UnHideLink       &457A9
  703. -------------------------------
  704. R0 = main window handle
  705. R2 = sub-window handle
  706.  
  707. Unhides the previously hidden link. Note that this call does no screen
  708. update - ie. the sub-window remains where it is.
  709.  
  710.  
  711. WimpExt_SendHelp         &457AA
  712. -------------------------------
  713. R0 = message text
  714. R1 = pointer to message block containing message of type &502
  715.  
  716. Sends a reply to message type &502, with the specified text. The message will
  717. appear in Help's Interactive Help Window, or WimpHelp's Standard Help Window.
  718.  
  719.  
  720. WimpExt_SendWimpHelp     &457AB
  721. -------------------------------
  722. R2 = keyword
  723. R3 = filename
  724.  
  725. Sends a message to WimpHelp, telling it to open a hypertext help window from
  726. a file as specified in R3, with the keyword as specified in R2.
  727.  
  728.  
  729. WimpExt_CreateMenu       &457AC
  730. -------------------------------
  731. R1 = pointer to menu structure, or window handle, or -1 to close menus
  732. R2 = menu X
  733. R3 = menu Y
  734.  
  735. Exactly the same as Wimp_CreateMenu, except that the parameters are stored so
  736. that, after you have processed the selection, if the user clicked ADJUST you
  737. can call WimpExt_ReCreateMenu (see below) to reopen the menu, or this can be
  738. done for you (see WimpExt_Initialise).
  739.  
  740.  
  741. WimpExt_ReCreateMenu     &457AD
  742. -------------------------------
  743.  
  744. Reopens the last menu opened with WimpExt_CreateMenu. Generates an error if
  745. the last operation was to close a menu, or if you have not called
  746. WimpExt_CreateMenu yet.
  747.  
  748.  
  749. WimpExt_ShadeEntry       &457AE
  750. -------------------------------
  751. R1 = pointer to menu structure
  752. R2 = number of option to shade/unshade (0...nn)
  753. R3 = 0 to unshade, any other to shade
  754. If bit 6 of R2 was set in WimpExt_Initialise:
  755. R3 = 0 to unshade entry, 1 to shade entry, 2 to toggle shade flag
  756. Exit:
  757. R0 = old state of menu entry (0 for unshaded, 1 for shaded)
  758.  
  759. Shades or unshades the specified menu entry. If bit 6 of R2 was set in
  760. WimpExt_Initialise then the alternative parameters are used as shown.
  761.  
  762.  
  763. WimpExt_TickEntry        &457AF
  764. -------------------------------
  765. R1 = pointer to menu structure
  766. R2 = number of option to tick/untick (0...nn)
  767. R3 = 0 to untick, any other to tick
  768. If bit 6 of R2 was set in WimpExt_Initialise:
  769. R3 = 0 to untick entry, 1 to tick entry, 2 to toggle tick flag
  770. Exit:
  771. R0 = old state of menu entry (0 for unticked, 1 for ticked)
  772.  
  773. Ticks or unticks the specified menu entry. If bit 6 of R2 was set in
  774. WimpExt_Initialise then the alternative parameters are used as shown.
  775.  
  776.  
  777. WimpExt_SetIconColour    &457B0
  778. -------------------------------
  779. R2 = window handle
  780. R3 = icon handle
  781. R4 = foreground colour (0-15 or -1 to keep the same)
  782. R5 = background colour (0-15 or -1 to keep the same)
  783. Exit:
  784. R0 = old foreground colour + old background colour * 16
  785.  
  786. Changes the specified icon's colour(s). If there is no change then the icon
  787. is not updated (ie. it doesn't flicker). This call will now work for anti-
  788. aliased fonts, but the icon MUST have an 'F' validation command, as the Wimp
  789. needs this to specify the icon's colour.
  790.  
  791.  
  792. WimpExt_ShadeIcon        &457B1
  793. -------------------------------
  794. R2 = window handle
  795. R3 = icon handle
  796. R4 = 0 to unshade icon, non-zero to shade icon
  797. If bit 6 of R2 was set in WimpExt_Initialise:
  798. R4 = 0 to unshade icon, 1 to shade icon, 2 to toggle shade flag
  799. Exit:
  800. R0 = old state of icon (0 for unshaded, 1 for shaded)
  801.  
  802. Shades the icon if R2 is non-zero, unshades it otherwise. Updates the screen
  803. if necessary. If the caret was in the icon and you are telling WimpExtension
  804. to shade it then the caret is removed (disowned). If bit 6 of R2 was set in
  805. WimpExt_Initialise then the alternative parameters are used as shown.
  806.  
  807.  
  808. WimpExt_PlotSprite       &457B2
  809. -------------------------------
  810. This SWI has been replaced by SWI WimpExt_SpriteOp 0. This call will still be
  811. supported - it just passes the call on to WimpExt_SpriteOp.
  812.  
  813.  
  814. WimpExt_RedrawDraw       &457B3
  815. -------------------------------
  816. This SWI has been replaced by SWI WimpExt_DrawOp 0, which is a lot better at
  817. displaying draw files than this one. This call will still be supported, but
  818. if you have written a program using it you are strongly recommended to change
  819. to WimpExt_DrawOp.
  820.  
  821.  
  822. WimpExt_PrePoll          &457B4
  823. -------------------------------
  824. To be called immediately before Wimp_Poll or Wimp_PollIdle.
  825.  
  826.  
  827. WimpExt_SetExtent        &457B5
  828. -------------------------------
  829. R0 = window handle
  830. R1 = pointer to block
  831.      R1+00 = New work area minimum x
  832.      R1+04 = New work area minimum y
  833.      R1+08 = New work area maximum x
  834.      R1+12 = New work area maximum y
  835.  
  836. Sets the work area extent of the specified window, altering the values to be
  837. whole pixels, and reopening the window (if already open) so that the change
  838. is reflected on the screen.
  839.  
  840.  
  841. WimpExt_MoveCaret        &457B6
  842. -------------------------------
  843. R0 = key
  844. R2 = window handle
  845. R3 = icon handle
  846. Exit:
  847. R0 preserved if no action taken, 0 otherwise
  848.  
  849. Moves the caret from its current writeable icon to the next one above or
  850. below (in number) if the key in R0 is up arrow or down arrow. If you set bit
  851. 8 of R2 on entry to WimpExt_Initialise then this SWI will be called
  852. automatically for you in WimpExt_Action, and the reason code translated to a
  853. null event if the key is processed.
  854.  
  855.  
  856. WimpExt_GetFontMenu      &457B7
  857. -------------------------------
  858. R0 = 0 to unshade 'System font' entry, 1 to shade it
  859. R1 = pointer to menu title (12 chars max), or 0 for default title ('Font')
  860. Exit:
  861. R1 = pointer to menu structure
  862.  
  863. Reads in the list of fonts currently available and creates a hierarchial
  864. menu structure with all the fonts listed by family. 'System font' is also on
  865. the root menu. This menu structure is guaranteed to remain in the same place
  866. for as long as your task is active. The font list MAY be read in the first
  867. time you call WimpExt_GetFontMenu, or it may have been read in earlier. This
  868. SWI may only be called if you set bit 2 of R2 when you called
  869. WimpExt_Initialise.
  870.  
  871.  
  872. WimpExt_DecodeFontMenu   &457B8
  873. -------------------------------
  874. R0 = pointer to buffer for font name
  875. R1 = pointer to Wimp_Poll block, reason code Menu_Selection
  876.  
  877. The font menu is decoded and the correct font name is placed in the buffer.
  878. If the user selects, for example, 'Trinity' of 'Trinity.xxx','Trinity.yyy'
  879. the submenus will be followed through, and the font name at the top of each
  880. menu used. This SWI may only be called if you set bit 2 of R2 when you called
  881. WimpExt_Initialise.
  882.  
  883.  
  884. WimpExt_ControlImmediate &457B9
  885. -------------------------------
  886. R1 = 0 or -1   : Close immediate window
  887.    = 1         : Check for mouse click in immediate window
  888.    = 2         : Open immediate requester and wait for mouse click
  889.    = 3         : Redraw icon - icon handle in R0
  890.    = 4         : Slab icon - icon handle in R0 (-1 to use currently slabbed
  891.                  icon), R2 = 1 to slab in, 0 to slab out
  892.    = 5         : Limit pointer to immediate window
  893.    = 6         : Redraw icon's 3D border - icon handle in R0
  894.    = 7         : Redraw icon:
  895.                  R0 = pointer to icon block
  896.                  R2 = 'Work area' X origin
  897.                  R3 = 'Work area' Y origin
  898.   >= &8000     : Open immediate window using data pointed to by R1
  899. If R1 = 2 then rest of registers as for WimpExt_OpenRequester
  900. Exit:
  901. If R1 = 1 or 2 : R0 = Icon handle of icon clicked on, or -1 for none
  902.  
  903. This SWI is for using windows like the Wimp_ReportError window that are not
  904. multi-tasking. You can only have one 'immediate window' open at a time, it is
  905. always on top of the window pile, and you MUST NOT call 'Wimp_Poll' while the
  906. immediate window is open.
  907. If R1 is 0 or -1 on entry, the immediate window is closed. If it was not open
  908. then no error is generated.
  909. If R1 is 1 on entry, then the program will check for mouse clicks on icons in
  910. the window. 3D icons will be slabbed automatically. -1 is returned if no iconwas clicked on.
  911. If R1 is 2 on entry, the rest of the registers are as for
  912. WimpExt_OpenRequester. It opens an 'immediate requester' and waits for a
  913. mouse click on one of the action buttons, or ESCAPE or RETURN. The icon
  914. clicked on is returned in R0.
  915. If R1 is 3 on entry, the icon in the immediate window whose handle is in R0
  916. will be redrawn (presumably because you have changed the indirected data).
  917. The 3D border is not redrawn.
  918. If R1 is 4 on entry, the icon whose handle is in R0 will be slabbed in or out
  919. depending on R2 - similar to WimpExt_SlabIcon for normal icons. If the
  920. specified icon handle is -1 and R2 is 0 then the currently slabbed icon (if
  921. any) is used.
  922. If R1 is 5, the mouse rectangle is redefined to be the size of the immediate
  923. window - similar to WimpExt_LimitPointer for normal windows. Use
  924. WimpExt_ReleasePointer to release the pointer again afterwards.
  925. If R1 is 6, the specified icon's 3D border is redrawn.
  926. If R1 is 7, the specified icon is drawn. You do not need to have an immediate
  927. window open to use this reason code.
  928. If R1 is greater than or equal to &8000 on entry, then an immediate window is
  929. created from the Wimp_CreateWindow block pointed to by R1.
  930. If you call WimpExt_PrePoll while an immediate window is open then it will be
  931. closed automatically - the Wimp does not know about immediate windows and the
  932. screen display would become corrupted if you kept an immediate window open
  933. over a call to Wimp_Poll[Idle].
  934. Icon types currently supported are:
  935.   sprite-only non-indirected
  936.   text-only, all types
  937. Unknown icon types will be ignored.
  938.  
  939.  
  940. WimpExt_Heap             &457BA
  941. -------------------------------
  942. R0 = reason code
  943. other registers as appropriate for reason code
  944.  
  945. This SWI provides access to a heap management system. Access to blocks is
  946. provided via 'anchors'. When calling WimpExt_Heap routines, you can either
  947. refer to a block by a pointer to it, or by a pointer to its anchor. I will
  948. refer to this as a 'block pointer'. The anchor contains the address of the
  949. block. This address may change on calls to WimpExt_Heap as the blocks are
  950. shuffled around, but the anchor will always stay fixed. The size of the block
  951. is stored 4 bytes before the start of the block.
  952.   eg. to find the size of a block from its anchor:
  953.      size%=!((!anchor%)-4)
  954. All these calls can return the errors 'Heap corrupt' or 'Bad heap operation'.
  955. All the calls act on the currently selected heap. The heap can be selected
  956. using R0=14.
  957.  
  958. R0 = 0 - Initialise standard heap:
  959. ----------------------------------
  960. R1 = pointer to base of heap
  961. R2 = number of anchors to allocate
  962.  
  963. Initialises the standard heap. R1 points to the base of the heap - it will
  964. grow upwards from here. R2 specifies the numbers of anchors to allocate
  965. initially. Each anchor takes 8 bytes. Note that R1 is rounded up to the
  966. nearest multiple of 8 plus 4 (ie. 8N+4). The heap is automatically selected
  967. as the current heap.
  968.  
  969. R0 = 1 - Describe heap:
  970. -----------------------
  971. Exit:
  972. R0 = currently selected heap pointer, or +1 for standard heap
  973. R2 = largest available block size
  974. R3 = total free
  975. R4 = memory used by heap
  976. R5 = number of anchors allocated
  977. R6 = number of anchors in use
  978.  
  979. Adds up all the sizes of the free blocks, and returns information about
  980. memory used by the heap. If the heap is empty then R2-R6 will be zero.
  981.  
  982. R0 = 2 - Allocate block:
  983. ------------------------
  984. R2 = size of block required
  985. Exit:
  986. R1 = pointer to anchor or zero if allocation failed
  987.  
  988. Tries to find a block of the required size. Increases the WimpSlot if
  989. necessary. If a call to Wimp_SlotSize fails then zero will be returned. Note
  990. that the size is rounded up to the next multiple of 8 plus 4.
  991.  
  992. R0 = 3 - Free block:
  993. --------------------
  994. R1 = block pointer
  995.  
  996. Frees the memory used by the specified block.
  997.  
  998. R0 = 4 - Reallocate block:
  999. --------------------------
  1000. R1 = block pointer
  1001. R2 = new size required
  1002. Exit:
  1003. R1 = pointer to anchor (the same anchor as before) or 0 if reallocate failed
  1004.  
  1005. Tries to resize the specified block. You should check R1 on exit to see if
  1006. the resize was successful (only on increasing the size, decreasing the size
  1007. will always be successful).
  1008.  
  1009. R0 = 5 - Tidy heap:
  1010. -------------------
  1011.  
  1012. Tries to tidy the heap, reducing the WimpSlot if possible. This can be
  1013. automatically performed once a second (in WimpExt_PrePoll) if you set bit 3
  1014. of R2 when you called WimpExt_Initialise. Note that this routine does not
  1015. tidy the heap fully, it just does a little bit each time it is called. This
  1016. is to keep the time cost down.
  1017.  
  1018. R0 = 6 - Compact heap:
  1019. ----------------------
  1020.  
  1021. Repeatedly calls Tidy Heap, until the heap is as small as it can get.
  1022.  
  1023. R0 = 7 - Find anchor:
  1024. ---------------------
  1025. R1 = block pointer
  1026. Exit:
  1027. R1 = pointer to anchor
  1028.  
  1029. Given a block pointer, returns a pointer to that block's anchor.
  1030.  
  1031. R0 = 8 - Fix blocks:
  1032. --------------------
  1033.  
  1034. Fixes the heap. Subsequent calls to the Tidy or Compact routines will have no
  1035. effect. Effectively, the heap becomes a non-relocatable heap like the RMA.
  1036. This call is provided so that if you temporarily need to rely on the blocks
  1037. not moving, you can easily do so. WimpExtension keeps a counter of the number
  1038. of times you call this routine, so that if you, for example, fix the blocks
  1039. twice in a row then you need to unfix them twice in a row before they are
  1040. actually unfixed.
  1041.  
  1042. R0 = 9 - Unfix blocks regardless of counter:
  1043. --------------------------------------------
  1044.  
  1045. Unfixes the heap, so that garbage disposal routines will work again. This
  1046. call zeroes the counter straight away - ie. the blocks are immediately
  1047. unfixed no matter how many times you called the fix routine.
  1048.  
  1049. R0 = 10 - Unfix blocks:
  1050. -----------------------
  1051.  
  1052. Unfixes the heap, so that garbage disposal routines will work again. This
  1053. routine decrements the fix counter, and only actually unfixes the blocks if
  1054. the counter reaches zero.
  1055.  
  1056. R0 = 11 - Increase anchors:
  1057. ---------------------------
  1058. R2 = number of anchors to add
  1059. Exit:
  1060. R1 = 0 indicates failure, non-zero indicates success
  1061.  
  1062. Increases the number of anchors. This routine is quite slow as it often has
  1063. to move the entire heap up in memory so you should use this routine
  1064. sparingly, if you need to use it at all. Note that this SWI causes blocks to
  1065. be relocated.
  1066.  
  1067. R0 = 12 - Allocate with anchor extend:
  1068. --------------------------------------
  1069. R2 = size of block required
  1070. Exit:
  1071. R1 = pointer to anchor or zero if allocation failed
  1072.  
  1073. Tries to find a block of the required size. Increases the WimpSlot if
  1074. necessary. If a call to Wimp_SlotSize fails then zero will be returned. Note
  1075. that the size is rounded up to the next multiple of 8 plus 4. If no free
  1076. anchors are available then the increase anchors call is used to make some
  1077. more; therefore using this SWI can cause blocks to be relocated. It is,
  1078. however, the recommended call to use for allocating blocks as it isn't
  1079. limited by the number of anchors already created.
  1080.  
  1081. R0 = 13 - Free all blocks
  1082. -------------------------
  1083.  
  1084. Frees all blocks in the currently selected heap belonging to your task.
  1085.  
  1086. R0 = 14 - Select heap
  1087. ---------------------
  1088. R1 = heap pointer, or +1 for standard heap, or -1 for no change
  1089. Exit:
  1090. R0 = previous heap pointer, or 0 if no previously selected heap
  1091. R1 = current heap pointer, or 0 if no currently selected heap
  1092.  
  1093. Selects a new heap to be used by the other WimpExt_Heap calls.
  1094.  
  1095. R0 = 15 - Relocate heap
  1096. -----------------------
  1097.  
  1098. Compares the heap addresses specified by hp_base and hp_rootptr. If they are
  1099. different, then hp_base is updated by hp_rootptr, and the anchors are
  1100. recalculated to account for the change of address.
  1101.  
  1102. R0 = 16 - Create a heap in a heap block
  1103. ---------------------------------------
  1104. R1 = heap pointer (blank, it will be filled in by this call)
  1105. R2 = number of anchors to create
  1106. Exit:
  1107. R1 = heap pointer, or 0 if the call failed due to lack of memory
  1108.  
  1109. This call creates a new heap inside a heap block in the currently selected
  1110. heap. The new heap is NOT selected as the current heap.
  1111.  
  1112.  
  1113. WimpExt_MemCopy          &457BB
  1114. -------------------------------
  1115. R0 = 'from' address (word aligned)
  1116. R1 = 'to' address (word aligned)
  1117. R2 = length (not necessarily word aligned)
  1118. Exit:
  1119. R0 preserved
  1120.  
  1121. Copies an area of memory very quickly. Can cope with overlap, R0=R1 or R2=0.
  1122.  
  1123.  
  1124. WimpExt_DataSave         &457BC
  1125. -------------------------------
  1126. R0 = file length
  1127. R1 = pointer to filename (pathname or leafname)
  1128. R2 = file type
  1129. R3 = pointer to data
  1130. R4 = zero to allow files to be saved to your own task, non-zero otherwise
  1131. R5 = pointer to Wimp_GetPointerInfo block if >=&8000, otherwise file will be
  1132.      saved to current mouse position
  1133. Exit:
  1134. R0 = 0 if failed due to attempt to save to own task, non-zero otherwise
  1135.  
  1136. Used to save a file from your program to a filer or to another task. When you
  1137. receive the User_Drag_Box event after the user has dragged the icon to where
  1138. they want it put, call WimpExt_DataSave to handle the data transfer. R5
  1139. allows you to use this call to save to a specified place - just use R5=0 if
  1140. you want to save to the pointer position. If R4 is non-zero on entry, then if
  1141. the user has dragged the file to a window or icon belonging to your task then
  1142. no action will be taken, and R0 will be zero on exit. Otherwise, when the
  1143. transfer has finished, WimpExtension will send you a message, number &45782,
  1144. with the word at R1+20 having the following meaning:
  1145.         0 = file not saved. Error block at R1+24
  1146.         1 = file saved but is 'unsafe' (eg. saved to another task)
  1147.         2 = file saved. Filename at R1+24
  1148.  
  1149.  
  1150. WimpExt_PlotBorder       &457BD
  1151. -------------------------------
  1152. R0 = reason code
  1153.  R0 = 0  =>  R1 = pointer to icon block
  1154.              R2 = window handle (or -1 for no window)
  1155.  R0 = 1  =>  R1 = pointer to block:
  1156.                R1 + 0  Minimum work area x coordinate
  1157.                R1 + 4  Minimum work area y coordinate
  1158.                R1 + 8  Maximum work area x coordinate
  1159.                R1 + 12 Maximum work area y coordinate
  1160.                R1 + 16 Border type
  1161.              R2 = window handle (or -1 for no window)
  1162.  
  1163. Like Wimp_PlotIcon, except it just redraws the 3D border. R0 specifies how
  1164. the coordinates and border type are to be specified. If bit 31 of R0 is set
  1165. then the border will be plotted slabbed in.
  1166.  
  1167.  
  1168. WimpExt_CentreWindowV    &457BE
  1169. -------------------------------
  1170. R1 = pointer to block:
  1171.       R1 +  0   visible area minimum x coordinate
  1172.       R1 +  4   visible area minimum y coordinate
  1173.       R1 +  8   visible area maximum x coordinate
  1174.       R1 + 12   visible area maximum y coordinate
  1175.       R1 + 28   window flags
  1176. Exit:
  1177.       Block contains altered coordinates
  1178.  
  1179. This call shifts the y coordinates in the supplied block so that the window
  1180. described would be centred vertically on the screen. You can use this call
  1181. before Wimp_CreateWindow - eg:
  1182.        SYS "WimpExt_CentreWindowV",,q%
  1183.        SYS "WimpExt_CreateWindow",,q% TO handle%
  1184. or you can use it before Wimp_OpenWindow - eg:
  1185.        SYS "WimpExt_CentreWindowV",,q%+4
  1186.        SYS "WimpExt_OpenWindow",,q%
  1187. If you are using WimpExt_LoadTemplates then windows can be centred
  1188. automatically for you (see description above).
  1189.  
  1190.  
  1191. WimpExt_Sort             &46380
  1192. -------------------------------
  1193. R0 = number of objects to sort
  1194. R1 = pointer to array of objects
  1195. R2 = pointer to comparison routine
  1196. R3 = workspace pointer for comparison procedure
  1197. R4 = size of object
  1198. R5 = address of temporary workspace of R4 bytes (only needed if R4>63)
  1199.  
  1200. This SWI will sort an array of objects. It is very similar to the OS_HeapSort
  1201. SWI, except that you can use it to sort an array of ANY object, rather than
  1202. just arrays of pointers. R2 points to a routine which is entered, in SVC
  1203. mode, as follows:
  1204.   R0  = address of object a
  1205.   R1  = address of object b
  1206.   R12 = value supplied to WimpExt_Sort in R3
  1207.   R13 = supervisor stack
  1208.   R14 = return address
  1209. The routine should compare the two objects and return, preserving all
  1210. registers apart from R0,R1,R12 and R14, with flags set as follows:
  1211.   a<b   Z=0, C=0
  1212.   a=b   Z=1, C=1
  1213.   a>b   Z=0, C=1
  1214. The actual method of sorting is unspecified; suffice it to say it's fast...
  1215. Although R5 doesn't have to be word-aligned, the sort will probably be faster
  1216. if it is.
  1217.  
  1218.  
  1219. WimpExt_MemMove          &46381
  1220. -------------------------------
  1221. R0 = from
  1222. R1 = to
  1223. R2 = size in bytes
  1224.  
  1225. Copies R2 bytes from R0 to R1. R0 and R1 need not be word-aligned, and R2
  1226. need not be a multiple of 4. This SWI uses the optimised memory copying
  1227. routine given in the RISC OS 2 PRMs. It does not cope with overlap (which is
  1228. why it's separate from WimpExt_MemCopy).
  1229.  
  1230.  
  1231. WimpExt_MenuWidth        &46382
  1232. -------------------------------
  1233. R1 = pointer to menu structure
  1234.  
  1235. This SWI scans through the specified menu, altering its width and the widths
  1236. of all its submenus, so that all the menus are the minimum width possible
  1237. while still displaying the text correctly (and neatly). This call does not
  1238. take account of sprites in menu structures.
  1239.  
  1240.  
  1241. WimpExt_DataLoad         &46383
  1242. -------------------------------
  1243. R0 = 0 : Load into heap block
  1244.   R1 = pointer to DataSave or DataLoad message block
  1245.   R2 = block pointer of block to receive file, or 0 to create new block
  1246.   R3 = offset in block to place file
  1247. R0 = 1 : Load into fixed block
  1248.   R1 = pointer to DataSave or DataLoad message block
  1249.   R2 = pointer to block to receive file
  1250.   R3 = length of block
  1251.  
  1252. Use this SWI to load files from the filer or other applications. If R0=0 then
  1253. the file is loaded into a WimpExt_Heap block, and can be any length, memory
  1254. permitting. If R0=1 then the file is loaded into a fixed area of memory, and
  1255. will not be loaded if it exceeds the length of the area. When you receive the
  1256. DataSave or DataLoad message, pass the block onto WimpExt_DataLoad, and the
  1257. transfer will be handled automatically. As long as this SWI doesn't return an
  1258. error, when the transfer has finished, WimpExtension will send you a message,
  1259. number &45784, with the word at R1+20 having the following meaning:
  1260.         0 = file not loaded. Error block at R1+28
  1261.         1 = file transferred successfully from another task
  1262.         2 = file loaded successfully from disc
  1263. A pointer to the block's anchor is at R1+24, if it was loaded into a heap
  1264. block. Otherwise a pointer to the area is at R1+24. If R1+20<>0 then the rest
  1265. of the block contains:
  1266.     R1+28 = length of file
  1267.     R1+32 = load address of file
  1268.     R1+36 = exec address of file
  1269.     R1+40 = filename (leafname if transferred from task)
  1270. Obviously you need to have initialised a heap to use this SWI. Note that
  1271. WimpExtension won't free the block if there's an error; your error handler
  1272. must do this if appropriate. The load and exec addresses don't indicate the
  1273. date if the file was transferred from another task (the relevant bits will
  1274. all be zero).
  1275.  
  1276.  
  1277. WimpExt_MoveCaretIcon    &46384
  1278. -------------------------------
  1279. R2 = window handle
  1280. R3 = icon handle
  1281.  
  1282. Moves the caret into the specified icon, keeping its vertical position as
  1283. nearly unchanged as possible. If the caret is currently disowned then it is
  1284. placed at the end of the string in the icon.
  1285.  
  1286.  
  1287. WimpExt_DrawOp           &46385
  1288. -------------------------------
  1289. R0 = reason code
  1290. other registers as appropriate for reason code
  1291.  
  1292. This SWI performs various operations on Draw files, including rendering them
  1293. onto the screen (or printer).
  1294.  
  1295. R0 = 0 : Render draw file
  1296. -------------------------
  1297. R1 = pointer to scaling and position table:
  1298.        R1+00 = amount to multiply X by * 65536
  1299.        R1+04 = 0
  1300.        R1+08 = 0
  1301.        R1+12 = amount to multiply Y by * 65536
  1302.        R1+16 = X origin (OS units)
  1303.        R1+20 = Y origin (OS units)
  1304. R2 = pointer to first object (ie. beginning of Draw file+40)
  1305. R3 = pointer to end of last object (ie. end of file)
  1306. R4 = pointer to graphics clip box, or 0 for no clipping:
  1307.        R4+00 = XMin
  1308.        R4+04 = YMin
  1309.        R4+08 = XMax
  1310.        R4+12 = YMax
  1311. Exit:
  1312. F0-F2 corrupted if scaling is not 1:1
  1313.  
  1314. This call displays a draw file. Objects will be checked one by one to see if
  1315. they are in the clipping area, and redrawn if they are. Currently the
  1316. following objects are supported:
  1317.       0 - font table
  1318.       1 - text
  1319.       2 - path
  1320.       5 - sprite
  1321.       6 - group
  1322.       7 - tag
  1323. This is all the objects specified in the RISC OS 2 PRMs, except for text AREA
  1324. objects, which are hardly ever used and are very very complicated. Magnifying
  1325. a draw file by more than about 8 times is probably not a good idea because
  1326. rounding errors in the Draw module will start to become significant. Note
  1327. that this call requires the ColourTrans module. It also requires the
  1328. FPEmulator module, if and only if the scaling is not 1:1. This call replaces
  1329. the old SWI WimpExt_RedrawDraw, which should now not be used. (This call is
  1330. much better anyway.)
  1331.  
  1332. R0 = 1 : Calculate bounding box
  1333. -------------------------------
  1334. R2 = pointer to first object
  1335. R3 = pointer to end of last object
  1336. Exit:
  1337. R4 = XMin (Draw units)
  1338. R5 = YMin (Draw units)
  1339. R6 = XMax (Draw units)
  1340. R7 = YMax (Draw units)
  1341.  
  1342. Calculates the bounding box of the specified objects. The coordinates are
  1343. returned in Draw units (which are OS Units * 256). Grouped objects are not
  1344. checked individually - the group's bounding box is used. Unknown object types
  1345. will not be checked. (This call 'knows' all the types described in the RISC
  1346. OS 2 PRMs.) If no objects with bounding boxes are in the set specified then
  1347. R4-R7 on exit are undefined.
  1348.  
  1349. R0 = 2 : Register unknown object handler
  1350. ----------------------------------------
  1351. R2 = pointer to routine (or 0 for no unknown object handler)
  1352. R3 = pointer to workspace
  1353.  
  1354. This routine will be called if the Render Draw File code encounters an
  1355. unknown object. The routine has the following entry and exit conditions:
  1356. Entry: (SVC mode)
  1357.   R2  = pointer to object
  1358.   R4  = pointer to scaling and position table
  1359.   R6  = clipping rectangle XMin (pretransformed)
  1360.   R7  = clipping rectangle YMin (pretransformed)
  1361.   R8  = clipping rectangle XMax (pretransformed)
  1362.   R9  = clipping rectangle YMax (pretransformed)
  1363.   R12 = your workspace pointer
  1364.   R13 = pointer to supervisor stack (at least 256 bytes guaranteed)
  1365.   R14 = return address
  1366. Exit:
  1367.   R1-R11,R13 preserved
  1368.   V flag set on error, with R0 pointing to standard error block
  1369.  
  1370.  
  1371. WimpExt_SpriteOp         &46386
  1372. -------------------------------
  1373. R0 = reason code
  1374.      +256 for user sprite area, R2 points to sprite name
  1375.      +512 for user sprite area, R2 points to sprite
  1376. unless otherwise specified:
  1377. R1 = sprite control block pointer (or +1 for Wimp sprite pool)
  1378. R2 = sprite pointer
  1379. other registers as appropriate for reason code
  1380.  
  1381. This SWI performs various operations on sprites, including displaying them
  1382. onto the screen (or printer). Note that these calls need ColourTrans if you
  1383. are using them with 256-colour sprites. Sprites in the system sprite area are
  1384. not supported.
  1385.  
  1386. R0 = 0 : Display sprite
  1387. -----------------------
  1388. R3 = x coordinate (OS units)
  1389. R4 = y coordinate (OS units)
  1390. R5 = plot action
  1391.  
  1392. Plots the specified sprite on the screen. This call is mode-independent, so
  1393. if necessary the sprite is changed size and/or the colours are chosen
  1394. appropriately.
  1395.  
  1396. R0 = 1 : Get palette
  1397. --------------------
  1398. Exit:
  1399. R3 = pointer to sprite's palette, or 0 if it doesn't have one
  1400. R4 = number of entries in palette
  1401.  
  1402. Locates the specified sprite's palette.
  1403.  
  1404. R0 = 2 : Make pixel translation table
  1405. -------------------------------------
  1406. R3 = pointer to block to contain table (1 byte per colour)
  1407. Exit:
  1408.      block contains pixel translation data
  1409.  
  1410. Calculates a pixel translation table for displaying the specified sprite in
  1411. the current mode. If the sprite has no palette then the desktop's colours are
  1412. used.
  1413.  
  1414. R0 = 3 : Make scaling table
  1415. ---------------------------
  1416. R3 = pointer to 16-byte block to contain table
  1417. Exit:
  1418.      block contains scaling table
  1419.  
  1420. Calculates a scaling table for displaying the specified sprite at normal size
  1421. in the current mode.
  1422.  
  1423. R0 = 4 : Display sprite scaled
  1424. ------------------------------
  1425. R3 = x coordinate (OS units)
  1426. R4 = y coordinate (OS units)
  1427. R5 = plot action
  1428. R6 = pointer to sprite scaling table:
  1429.      R6 + 00  x multiplier
  1430.      R6 + 04  y multiplier
  1431.      R6 + 08  x divisor
  1432.      R6 + 12  y divisor
  1433.  
  1434. Plots the specified sprite on the screen, scaled according to the table. This
  1435. call is mode-independent, so if necessary the sprite is changed size and/or
  1436. the colours are chosen appropriately. The sprite is first scaled to be the
  1437. correct size in the current mode, then the specified scaling table is used.
  1438.  
  1439. R0 = 5 : Copy sprite
  1440. --------------------
  1441. R3 = pointer to destination sprite area (or +1 for Wimp sprite pool)
  1442.  
  1443. Copies the specified sprite into the destination sprite area. Gives an error
  1444. if there isn't enough room. Note that sprites with duplicate names will NOT
  1445. be overwritten; you will end up with two sprites with the same name.
  1446.  
  1447. R0 = 6 : Copy sprite area
  1448. -------------------------
  1449. R1 = source sprite control block pointer (or +1 for Wimp RMA sprite pool,
  1450.      or +2 for Wimp ROM sprite pool)
  1451. R2 = target sprite control block pointer (or +1 for Wimp sprite pool)
  1452.  
  1453. Copies ALL the sprites from the source sprite area to the target sprite area.
  1454. Gives an error if there isn't enough room. Note that sprites with duplicate
  1455. names will NOT be overwritten; you will end up with two sprites with the same
  1456. name.
  1457.  
  1458. R0 = 7 : Remove duplicate names
  1459. -------------------------------
  1460. R1 = sprite control block pointer (or +1 for Wimp sprite pool)
  1461.  
  1462. Checks for sprites with duplicate names. If any exist, all copies except the
  1463. LAST one will be deleted.
  1464.  
  1465. R0 = 8 : Copy sprite area sprite by sprite
  1466. ------------------------------------------
  1467. R1 = source sprite control block pointer (or +1 for Wimp RMA sprite pool,
  1468.      or +2 for Wimp ROM sprite pool)
  1469. R2 = target sprite control block pointer (or +1 for Wimp sprite pool)
  1470.  
  1471. Copies ALL the sprites from the source sprite area to the target sprite area.
  1472. Gives an error if there isn't enough room. The sprites will be copied one by
  1473. one, with duplicate sprite names removed before each copy. This means that
  1474. this call, while being slower than 'Copy sprite area' followed by 'Remove
  1475. duplicate names', often requires less free memory in the target sprite area.
  1476.  
  1477. R0 = 9 : Check if sprite needs to be transformed
  1478. ------------------------------------------------
  1479. R3 = mode to check for, or -1 for current mode
  1480. Exit:
  1481. R0 = bit   meaning if set
  1482.      0     a pixel translation table would be needed
  1483.      1     a scaling table would be needed
  1484.      2-31  undefined; will be 0 if the sprite doesn't need transforming
  1485.  
  1486. Checks whether the specified sprite needs to be scaled or needs a pixel
  1487. translation table to be plotted correctly in the specified mode. If either of
  1488. these things are required, other WimpExt_SpriteOp calls exist to calculate
  1489. them for you.
  1490.  
  1491. R0 = 10 : Global replace
  1492. ------------------------
  1493. R3 = search colour
  1494. R4 = replace colour
  1495.  
  1496. Replaces all pixels of colour R3 with pixels of colour R4. This routine isn't
  1497. very fast, but it works. Currently it won't work with 256-colour sprites.
  1498.  
  1499.  
  1500. WimpExt_Intersect        &46387
  1501. -------------------------------
  1502. R0 = 0 : Boxes in registers:
  1503.   R2 = XMin1
  1504.   R3 = YMin1
  1505.   R4 = XMax1
  1506.   R5 = YMax1
  1507.   R6 = XMin2
  1508.   R7 = YMin2
  1509.   R8 = XMax2
  1510.   R9 = YMax2
  1511. R0 = 1 : Boxes in blocks:
  1512.   R2 = pointer to XMin1,YMin1,XMax1,YMax1
  1513.   R3 = pointer to XMin2,YMin2,XMax2,YMax2
  1514. Exit:
  1515. If boxes intersect:
  1516. R0 = 1, C flag set
  1517. If boxes don't intersect:
  1518. R0 = 0, C flag clear
  1519.  
  1520. Checks whether the specified rectangles intersect.
  1521.  
  1522.  
  1523. WimpExt_BorderOp         &46388
  1524. -------------------------------
  1525. R0 = reason code
  1526. other registers as appropriate for reason code
  1527.  
  1528. R0 = 0 : Get border number
  1529. --------------------------
  1530. R1 = pointer to icon block
  1531. Exit:
  1532. R0 = border number, or -1 if the icon has no 3D border
  1533.  
  1534. Returns the number of the 3D border of the specified icon. -1 is returned if
  1535. the icon has no 3D border.
  1536.  
  1537. R0 = 1 : Get border width
  1538. -------------------------
  1539. R2 = border number (0-6)
  1540. Exit:
  1541. R0 = width in OS units, or 0 if R2 did not contain a valid border number
  1542.  
  1543. Returns the width of the 3D border outside the icon's bounding box. 0 is
  1544. returned if an invalid border type is specified.
  1545.  
  1546. R0 = 2 : Get bounding box in registers
  1547. --------------------------------------
  1548. R1 = pointer to icon block
  1549. Exit:
  1550. R2 = XMin
  1551. R3 = YMin
  1552. R4 = XMax
  1553. R5 = YMax
  1554.  
  1555. Returns the bounding box of the icon, including the 3D border if present.
  1556.  
  1557. R0 = 3 : Get bounding box in block
  1558. ----------------------------------
  1559. R1 = pointer to icon block
  1560. R2 = pointer to 16-byte block to receive bounding box
  1561. Exit:
  1562. R2 +  0 = XMin
  1563. R2 +  4 = YMin
  1564. R2 +  8 = XMax
  1565. R2 + 12 = YMax
  1566.  
  1567. Returns the bounding box of the icon, including the 3D border if present.
  1568.  
  1569.  
  1570. WimpExt_ManualLink       &46389
  1571. -------------------------------
  1572. R2 = main window handle
  1573. R3 = sub-window handle
  1574. R4 = flags
  1575.      bit    meaning
  1576.      0      clip linked window to the left of the main window
  1577.      1      clip linked window to the right of the main window
  1578.      2      clip linked window above the main window
  1579.      3      clip linked window below the main window
  1580.      4-30   reserved; MUST BE 0
  1581.      31     link is hidden
  1582. R5 = X offset between main and sub-window
  1583. R6 = Y offset between main and sub-window
  1584.  
  1585. Will link two windows so the sub-window moves with the main window. Currently
  1586. there is a limit of 16 linked windows - this may be removed in a later
  1587. version.
  1588.  
  1589.  
  1590. WimpExt_MiscOp           &4638A
  1591. -------------------------------
  1592. R0 = reason code
  1593. other registers as appropriate for reason code
  1594.  
  1595. R0 = 0 : Read defaults
  1596. ----------------------
  1597. R1 = pointer to block to read values (64 bytes long)
  1598. Exit:
  1599. R1 +  0 = top-left colour
  1600. R1 +  4 = bottom-right colour
  1601. R1 +  8 = in colour
  1602. R1 + 12 = channel colour
  1603. R1 + 16 = minimum slabbing time
  1604. R1 + 20 = sprite style
  1605.           bit    meaning
  1606.           0      0 = 3D, 1 = flat
  1607.           1-31   reserved
  1608.  
  1609. Reads in the default values as specified by *WimpExt Defaults. The block
  1610. should be at least 64 bytes long, to allow room for future expansion.
  1611.  
  1612. R0 = 1 : Read window border thickness
  1613. -------------------------------------
  1614. Exit:
  1615. R2 = title thickness (OS Units)
  1616. R3 = vertical scrollbar thickness (OS Units)
  1617. R4 = horizontal scrollbar thickness (OS Units)
  1618.  
  1619. Reads the thickness of the window borders. Needed because on RISC OS 3 Acorn
  1620. rather stupidly decided to make it so that you can change their thickness.
  1621.  
  1622.  
  1623. WimpExt_ViewIcon         &4638B
  1624. -------------------------------
  1625. R0 = movement type:
  1626.      0 = scroll window minimum amount necessary
  1627.      1 = centre icon in window (only if it's currently outside the window)
  1628.      2 = choose 0 or 1 depending on how far outside the window the icon is
  1629. R2 = window handle (or -1 for caret window and icon)
  1630. R3 = icon handle (if R2<>-1)
  1631.  
  1632. Checks to see if the specified icon is in the portion of the window which is
  1633. visible on the screen, and scrolls the window to display it if it isn't. If
  1634. R2=-1 then the icon containing the caret (if if belongs to your task) is
  1635. used. R0=2 is the recommended movement type to use.
  1636.  
  1637.  
  1638. WimpExt_SubstituteArgs   &4638C
  1639. -------------------------------
  1640. R0 = pointer to template string
  1641. R1 = pointer to buffer to hold resulting string
  1642. R2 = pointer to string %0
  1643. R3 = pointer to string %1
  1644. R4 = pointer to string %2
  1645. R5 = pointer to string %3
  1646. R6 = pointer to string %4
  1647. Exit:
  1648. R0 = pointer to zero-byte terminator of substituted string
  1649.  
  1650. Takes a string of the form 'This is an %0 of the %1 of %2_%3' and substitutes
  1651. the given strings when %0,%1,%2,%3 or %4 is encountered. eg:
  1652.  
  1653.   SYS "WimpExt_SubstituteArgs","This is an %0 of the %1 of %2_%3",q%,"example","use","WimpExt","SubstituteArgs" TO ,string$
  1654.  
  1655. would give 'This is an example of the use of WimpExt_SubstituteArgs'. Any
  1656. strings not used in the template do not need to have sensible values in the
  1657. corresponding register, although you may like to make the register zero, in
  1658. which case WimpExtension will fault that string's use. To include a % in the
  1659. template, use %%.
  1660.  
  1661.  
  1662. WimpExt_RedirectSprites  &4638D
  1663. -------------------------------
  1664. R0 = pointer to sprite area control block, or +1 for Wimp sprite area
  1665. R1 = pointer to Wimp_CreateWindow block
  1666.  
  1667. Sets the sprite area control block pointer of all the indirected, sprite-only
  1668. icons in the CreateWindow block to R0.
  1669.